const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const path = require('path');
const cors = require('cors');
const { initDatabase, db } = require('./config/database');

// 初始化Express应用
const app = express();
const server = http.createServer(app);
const io = socketIo(server);

// 初始化数据库
initDatabase();

// 创建uploads目录（如果不存在）
const fs = require('fs');
if (!fs.existsSync('uploads')) {
  fs.mkdirSync('uploads');
}

// 创建public目录（如果不存在）
if (!fs.existsSync('public')) {
  fs.mkdirSync('public');
}

// 创建空的favicon.ico文件（如果不存在）
const faviconPath = path.join(__dirname, 'public', 'favicon.ico');
if (!fs.existsSync(faviconPath)) {
  fs.writeFileSync(faviconPath, '');
}

// 中间件
app.use(cors()); // 添加CORS支持
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/uploads', express.static('uploads'));

// 路由
app.use('/api/auth', require('./routes/auth'));
app.use('/api/characters', require('./routes/characters'));
app.use('/api/photos', require('./routes/photos'));
app.use('/api/diaries', require('./routes/diaries'));
app.use('/api/messages', require('./routes/messages'));
app.use('/api/events', require('./routes/events'));

// Socket.IO 实时通信
io.on('connection', (socket) => {
  console.log('用户连接:', socket.id);
  
  // 加入聊天室
  socket.on('join chat', (data) => {
    socket.join(data.characterId);
    console.log(`用户${data.userId}加入了角色${data.characterId}的聊天室`);
  });
  
  // 发送消息
  socket.on('send message', (data) => {
    // 保存消息到数据库的逻辑应该在客户端调用API完成
    // 广播消息给房间内的所有用户
    io.to(data.characterId).emit('receive message', data);
  });
  
  // 断开连接
  socket.on('disconnect', () => {
    console.log('用户断开连接:', socket.id);
  });
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: '服务器内部错误' });
});

// 404处理
app.use((req, res) => {
  res.status(404).json({ error: '接口不存在' });
});

// 优雅关闭
process.on('SIGINT', () => {
  console.log('正在关闭服务器...');
  db.close((err) => {
    if (err) {
      console.error('关闭数据库连接时出错:', err.message);
    } else {
      console.log('数据库连接已关闭');
    }
    process.exit(0);
  });
});

// 启动服务器
const PORT = process.env.PORT || 3001;
server.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
});